#include <iostream>
#include <pthread.h>
#include <unistd.h>
#include <string>
#include <cstdio>
#include <string.h>
#include <thread>
#include <stdio.h>

int* add=nullptr;
void *routine2(void *args)
{
    std::string name = static_cast<char *>(args);
    int a=10;
    add=&a;
    while (true)
    {
        std::cout << "I am(不修改) " << name<<"the a"<<a << std::endl;
        sleep(1);
    }
}
void *routine1(void *args)
{
    std::string name = static_cast<char *>(args);
    while (true)
    {
        std::cout << "I am (修改) " << name << std::endl;
        if(add!=nullptr)
        (*add)+=1;
        //线程有异常 全部线程的信号标志位都置为一 ，全部都统一处理信号
    //     int* p=nullptr;
    //     *p=10;
    //     sleep(1);
    // 
    }
}

int main()
{
    pthread_t tid1;
    pthread_create(&tid1, nullptr, routine1, (void *)"thread-1");

    pthread_t tid2;
    pthread_create(&tid2, nullptr, routine2, (void *)"thread-2");

    // pthread_t tid3;
    // pthread_create(&tid3, nullptr, routine, (void *)"thread-3");

    // pthread_t tid4;
    // pthread_create(&tid4, nullptr, routine, (void *)"thread-4");

    // // std::cout << "new thread id: " << tid << std::endl;
    // //如果主线程不加while 则主线程执行完之后 就会退出，主线程退出全部退出
    // //显示器是线程的共享文件，所以打印出来的有可能是乱码的
    // while (true)
    // {
    //     printf("new thread id: 0x%lx\n", tid1);
    //     printf("new thread id: 0x%lx\n", tid2);
    //     printf("new thread id: 0x%lx\n", tid3);
    //     printf("new thread id: 0x%lx\n", tid4);
    //     sleep(1);
    // }
}

// #define NUM 10

// class ThreadData
// {
// public:
//     ThreadData()
//     {

//     }
//     void Init(const int a,const int b,const std::string& name)
//     {
//         _name=name;
//         _a=a;
//         _b=b;
//     }
//     int Result()
//     {
//         return _result;
//     }
//     void Exute()
//     {
//         _result=_a+_b;
//     }
//     std::string Name()
//     {
//         return _name;
//     }
//     void SetTid(pthread_t tid)
//     {
//         _tid=tid;
//     }
//     pthread_t GetTid()
//     {
//         return _tid;
//     }
//     int A(){return _a;}
//     int B(){return _b;}
//     ~ThreadData()
//     {

//     }
// private:
//     std::string _name;
//     int _a;
//     int _b;
//     int _result;
//     pthread_t _tid;

// };
// void* routine(void* args)
// {
//     ThreadData* targs=static_cast< ThreadData*>(args);
//     while(true)
//     {

//         std::cout<<"I am a new thread the tid is"<<targs->GetTid()<<std::endl;
//         targs->Exute();
//         sleep(1);
//         break;
//     }
//     return targs;//

// }
// int main()
// {
//     ThreadData id[NUM];
//     //初始化每一个线程的数据
//     for(int i=0;i<NUM;i++)
//     {
//         char buffer[64];
//         snprintf(buffer,sizeof(buffer),"thread-%d",i);
//         id[i].Init(i+10,i*10,buffer);
//     }
//     //开始创建每个线程
//     for(int i=0;i<NUM;i++)
//     {
//         pthread_t tid;
//         pthread_create(&tid ,nullptr,routine,&id[i]);
//         id[i].SetTid(tid);
//     }
//     //回收线程
//     for(int i=0;i<NUM;i++)
//     {
//         pthread_join(id[i].GetTid(),nullptr);
//     }
//     for(int i=0;i<NUM;i++)
//     {
//         printf("td[%d]'s id is %ld the a + b = result %d+%d= %d\n",i,id[i].GetTid(), id[i].A(),id[i].B(),id[i].Result());
//     }

// }

// void* routinue(void* args)
// {
//     std::string name = static_cast<const char*> (args);
//     while(true)
//     {
//         std::cout<<"我是线程 name is"<<name<<std::endl;
//         sleep(1);
//     }
//     return 0;

// }
// int main()
// {
//     std::thread t([](){
//         while(true)
//         {
//             std::cout<<"我是线程 name is thred-1"<<std::endl;
//             sleep(1);
//         }
//     });
//     while(true)
//     {
//          std::cout<<"I am a main pthread"<<std::endl;
//         sleep(1);
//     }
//     // pthread_t tid;
//     // int n=pthread_create(&tid,nullptr,routinue,(void*)"thread-1");
//     // if(n!=0)
//     // {
//     //     std::cout<<"create thread false the error is "<<strerror(n)<<std::endl;
//     // }
//     // while(true)
//     // {
//     //     std::cout<<"I am a main pthread "<<std::endl;
//     //     sleep(1);
//     // }
// }